#include <stdio.h>
#include <stdlib.h>
#include <time.h>

////////////////////////////////////////////////
//                                            //
//	Funcion fibonacci (finalizada)			  //
//	Funcion sumatoria (finalizada)			  //
//	Funcion productiMatriz (finalizada)		  //
//  Contar tiempos de ejecucion (incompleta) //
// 	Escritura y lectura (incompleta)		  //
//											  //	
//  *Borrar prints de prueba				  //
//                                            //
////////////////////////////////////////////////

	
int NO_ME_MIRES;

long int fibonacci(int numero);
void sumatoria(float arreglo[], int n, float *suma, long int *contadorTiempo);
void lecturaEscritura(char archivo[20]);
float *crearVector(FILE *archivo, float numero);
float *crearMatriz(FILE *archivo, int fila, int columna);
void saltoEnLinea(FILE *archivo);
float *productoMatriz(float matriz[] , float vector[], int fila, int columna);


int main(void){
	lecturaEscritura("input.txt");
	return 1;
}


void tiempo(long int *contador)
{
	(*contador)++;
}	

void lecturaEscritura(char nombre[20])
{
	
	float lectura, suma;
	int contador, aux;
	long int contadorTiempo;
	FILE*archivo = fopen(nombre, "r");
	fscanf(archivo,"%i", &contador);
	aux = contador;
	for(;contador!=0; contador--)
	{
		fscanf(archivo, "%f", &lectura);
		float *punteroArreglo = crearVector(archivo, lectura+1);
		suma = 0;
		sumatoria(punteroArreglo, lectura+1, &suma, &contadorTiempo);
		printf("timepo: %li\n", contadorTiempo);
		printf("suma: %f\n", suma);
		saltoEnLinea(archivo);
	}
	for(contador = aux;contador !=0; contador--)
	{
		int fila, columna, i;
		fila = 0;
		columna = 0;
		fscanf(archivo,"%i %i",&fila,&columna);
		float *punteroMatriz = crearMatriz(archivo, fila, columna);
		float *punteroVector = crearVector(archivo, columna);
		float *punteroProducto = productoMatriz(punteroMatriz, punteroVector, fila, columna);
		printf("producto\n");
		for(i = 0; i != fila; i++)
			printf("%d ", (int)punteroProducto[i]);
		printf("\n");
	}
	for(contador = aux;contador != 0; contador--)
	{
		int numero;
		fscanf(archivo, "%d", &numero);
		contadorTiempo = 0;
		printf("Numero: %li \n", fibonacci(numero));
		printf("Tiempo: %i  \n", NO_ME_MIRES);
		NO_ME_MIRES = 0;
	}
	fclose(archivo);
}

long int fibonacci(int num)
{
	if(num == 1 || num == 0)
	{
		NO_ME_MIRES+=2;
		return 1;
	}
	else
		return fibonacci(num-1) + fibonacci(num-2);	
}

void sumatoria(float arreglo[], int n, float *suma, long int *contadorTiempo)
{
	int i;
	*contadorTiempo = 1;
	for(i = 0; i < n ; i++)
	{
		*suma += arreglo[i];
		*contadorTiempo += 5;
	}
}
float *crearVector(FILE *archivo, float numero)
{
	int contador;
	float *arreglo = malloc(numero*sizeof(float));
	printf("Vector\n");
	for(contador = 0; contador < numero; contador++)
	{
		fscanf(archivo,"%f", &arreglo[contador]);
		printf("%d ",(int)arreglo [contador]);
	}
	printf("\n");
	return arreglo;
}	

float *crearMatriz(FILE *archivo, int fila, int columna)
{
	float *Matriz = malloc((columna*fila)*sizeof(int));
	int cont, i;
	if(Matriz == NULL)
		printf("es NULL");
	else
	{	
		printf("Matriz \n");
		for(cont = 0; cont != (fila*columna); cont++)
		{
			fscanf(archivo, "%f", &Matriz[cont]);
		}	
		for(i = 0; i != (fila*columna); i ++)
			printf("%i ", (int)Matriz[i]);
		printf("\n");
	}	
	return Matriz;
}

void saltoEnLinea(FILE *archivo)
{
	char salto;
	while(salto!= '\n')
		fscanf(archivo,"%c", &salto);
}

float *productoMatriz(float matriz[] , float vector[], int fila, int columna)
{
	float *resultado = malloc(fila*sizeof(float));
	float suma;	
	int i, j, nfm;
	nfm =0;
	for(i = 0; i != fila; i++)
	{
		for(j = 0; j != columna; j++)
			suma +=vector[j]*matriz[j+nfm]; 
		resultado[i] = suma;
		nfm += columna;
		suma = 0;
	}
	return resultado;
}
